import pygame
from time import sleep
import random

#设置通用属性
GB_COLOR = pygame.Color(0,0,0)
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 500
TEXT_COLOR = pygame.Color(255,0,0)

class Tank():
    def __init__(self,left:int,top:int) -> None:
        #设置我方坦克的图片资源
        self.images = {
            "U":pygame.image.load("./img/p1tankU.gif"),
            "D":pygame.image.load("./img/p1tankD.gif"),
            "L":pygame.image.load("./img/p1tankL.gif"),
            "R":pygame.image.load("./img/p1tankR.gif")
        }
        #设置我方坦克的方向
        self.direction = "U"
        #获取图片信息
        self.image = self.images.get(self.direction)
        #获取图形的矩形
        self.rect = self.image.get_rect()
        #设置我方坦克位置
        self.rect.left = left
        self.rect.top = top
        #设置移动速度
        self.speed = 10
        #设置移动开关,False:停止移动,True:移动
        self.remove = False

    def display_tank(self) -> None:
        """
        显示坦克
        """
        #获取最新坦克的朝向位置图片
        self.image = self.images.get(self.direction)
        MainGame.window.blit(self.image,self.rect)
    def move(self) -> None:
        """
        移动坦克
        """
        if self.direction == "L":
            #判断坦克的位置是否已在左边界上
            if self.rect.left > 0:
                #修改坦克的位置 离左边的距离 - 操作
                self.rect.left = self.rect.left - self.speed

        elif self.direction == "R":
            #判断坦克的位置是否已在右边界上
            if self.rect.right + self.rect.width < SCREEN_WIDTH:
                #修改坦克的位置 离左边的距离 + 操作
                self.rect.left = self.rect.left + self.speed
            
        elif self.direction == "U":
            #判断坦克的位置是否已在上边界上
            if self.rect.top > 0:
                #修改坦克的位置 离上边的距离 - 操作
                self.rect.top = self.rect.top - self.speed

        elif self.direction == "D":
            #判断坦克的位置是否已在下边界上
            if self.rect.top + self.rect.height < SCREEN_HEIGHT:
                #修改坦克的位置 离上边的距离 + 操作
                self.rect.top = self.rect.top + self.speed
        
    def shot(self) -> None:
        """
        坦克的射击
        """
        pass
class MyTank(Tank):
    """
    我方坦克类
    """
    def __init__(self) -> None:
        pass
class EnemyTank(Tank):
    """
    敌方坦克类
    """
    def __init__(self,left,top,speed) -> None:
        self.images = {
            "U":pygame.image.load("./img/enemy1U.gif"),
            "D":pygame.image.load("./img/enemy1D.gif"),
            "L":pygame.image.load("./img/enemy1L.gif"),
            "R":pygame.image.load("./img/enemy1R.gif")
        }
        #设置敌方坦克的方向
        self.direction = self.rand_direction()
        #获取图片信息
        self.image = self.images.get(self.direction)
        #获取图片的矩形信息
        self.rect = self.image.get_rect()
        #设置敌方坦克位置
        self.rect.left = left
        self.rect.top = top
        #设置移动速度
        self.speed = speed

    def rand_direction(self) -> str:
        """
        生成随机方向
        """
        chice = random.randint(1,4)
        if chice == 1:
            return "U"
        elif chice == 2:
            return "D"
        elif chice == 3:
            return "L"
        elif chice == 4:
            return "R"

class Bullet:
    """ 
    子弹类 
    """
    def __init__(self) -> None:
        pass
    def display_bullet(self) -> None:
        """
        显示子弹
        """
        pass
    def move(self) -> None:
        """
        子弹的移动
        """
        pass

class Wall:
    """
    墙壁类
    """
    def __init__(self) -> None:
        pass
    def diaplay_wall(self) -> None:
        """
        显示墙壁
        """
        pass

class Explode:
    """
    爆炸效果类
    """
    def __init__(self) -> None:
        pass
    def display_explode(self) -> None:
        """
        显示爆炸效果
        """
        pass

class Music:
    """
    音效类
    """
    def __init__(self) -> None:
        pass
    def play(self) -> None:
        """
        播放音效
        """
        pass

class MainGame:
    """
    游戏主窗口类
    """
    #游戏主窗口对象
    window = None
    #设置我方坦克
    my_tank = None
    #存储敌方坦克的列表
    enemy_tanks_list = []
    #设置敌方坦克数量
    enemy_tanks_count=6

    def __init__(self) -> None:
        pass
    def start_game(self) -> None:
        """
        开始游戏
        """
        # 初始化游戏窗口
        pygame.display.init()
        # 创建一个窗口
        MainGame.window=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
        # 设置窗口标题
        pygame.display.set_caption("坦克大战1.0")
        #创建我方坦克
        MainGame.my_tank = Tank(350,200)
        #创建敌方坦克
        self.create_enemy_tank()

        # 刷新游戏窗口
        while True:
            sleep(0.02)
            #给窗口设置填充色
            MainGame.window.fill(GB_COLOR)
            #增加提示文字
            #1.要增加文字内容
            num = 6
            text = self.get_text_surface(f'敌方坦克剩余数量{num}')
            #2.如何把文字加上
            MainGame.window.blit(text,(10,10))
            #增加事件
            self.get_event()
            #显示我方坦克
            MainGame.my_tank.display_tank()
            #显示敌方坦克
            self.display_enemy_tank()
            #移动我方坦克
            if MainGame.my_tank.remove:
                MainGame.my_tank.move()

            pygame.display.update()
            
    def create_enemy_tank(self) -> None:
        """
        创建敌方坦克
        """
        self.enemy_top = 100
        self.enemy_speed = 10
        for i in range(self.enemy_tanks_count):
            #创建敌方坦克
            left = random.randint(0,600)
            #生成敌方坦克的位置
            e_tank = EnemyTank(left,self.enemy_top,self.enemy_speed)
            #将敌方坦克添加到列表中
            self.enemy_tanks_list.append(e_tank)

    def display_enemy_tank(self) -> None:
        """
        显示敌方坦克
        """
        for e_tank in self.enemy_tanks_list:
            e_tank.display_tank()

    
    def get_text_surface(self,text:str) -> None:
        """
        获取文字的 图片
        """
        #初始化字体模块
        pygame.font.init()
        #获取可以使用的字体
        #print(pygame.font.get_fonts())
        #创建字体
        font = pygame.font.SysFont("kaiti",18)
        #绘制文字信息
        text_surface = font.render(text,True,TEXT_COLOR)
        #将绘制的文字信息返回
        return text_surface
    
    def get_event(self) -> None:
        """
        获取事件
        """
        #获取所有事件
        event_list = pygame.event.get()
        #遍历事件
        for event in event_list:
            #判断是什么事件，然后做出相应的处理
            if event.type==pygame.QUIT:
                #点击关闭按钮
                self.end_game()
            if event.type == pygame.KEYDOWN:
                #按下键盘
                if event.key == pygame.K_LEFT:
                    print("坦克向左移动")
                    #修改方向
                    MainGame.my_tank.direction = "L"
                    #修改坦克移动的状态为True
                    MainGame.my_tank.remove = True

                elif event.key == pygame.K_RIGHT:
                    print("坦克向右移动")
                    #修改方向
                    MainGame.my_tank.direction = "R" 
                    #修改坦克移动的状态为True
                    MainGame.my_tank.remove = True

                elif event.key == pygame.K_UP:
                    print("坦克向上移动")
                    #修改方向
                    MainGame.my_tank.direction = "U"
                    #修改坦克移动的状态为True
                    MainGame.my_tank.remove = True

                elif event.key == pygame.K_DOWN:
                    print("坦克向下移动")
                    #修改方向
                    MainGame.my_tank.direction = "D"
                    #修改坦克移动的状态为True
                    MainGame.my_tank.remove = True
            if event.type == pygame.KEYUP and event.key in (pygame.K_LEFT,pygame.K_RIGHT,pygame.K_UP,pygame.K_DOWN):
                MainGame.my_tank.remove = False
    def end_game(self) -> None:
        """
        结束游戏
        """
        print("谢谢使用，欢迎再次使用")
        exit()

if __name__ == "__main__":
    #调用MainGame类中的start_Game方法，开始游戏
    MainGame().start_game()